// Package interfaces 定义各层之间的接口契约
// 该包提供了仓库层接口定义，实现松耦合的设计
package interfaces

import (
	"aigen-todo/internal/models"
)

// UserRepositoryInterface 定义了用户仓库的接口
// 该接口提供了用户实体的增删改查操作
type UserRepositoryInterface interface {
	// Create 创建新用户
	// 参数:
	//   user - 用户模型指针
	// 返回值:
	//   error - 创建错误信息
	Create(user *models.User) error

	// GetByID 根据ID获取用户
	// 参数:
	//   id - 用户ID
	// 返回值:
	//   *models.User - 用户模型指针
	//   error - 查询错误信息
	GetByID(id uint64) (*models.User, error)

	// GetByUsername 根据用户名获取用户
	// 参数:
	//   username - 用户名
	// 返回值:
	//   *models.User - 用户模型指针
	//   error - 查询错误信息
	GetByUsername(username string) (*models.User, error)

	// GetByEmail 根据邮箱获取用户
	// 参数:
	//   email - 邮箱地址
	// 返回值:
	//   *models.User - 用户模型指针
	//   error - 查询错误信息
	GetByEmail(email string) (*models.User, error)

	// Update 更新用户信息
	// 参数:
	//   user - 用户模型指针
	// 返回值:
	//   error - 更新错误信息
	Update(user *models.User) error

	// Delete 删除用户（软删除）
	// 参数:
	//   id - 用户ID
	// 返回值:
	//   error - 删除错误信息
	Delete(id uint64) error
}

// TaskGroupRepositoryInterface 定义了任务分组仓库的接口
// 该接口提供了任务分组实体的增删改查操作
type TaskGroupRepositoryInterface interface {
	// Create 创建新任务分组
	// 参数:
	//   group - 任务分组模型指针
	// 返回值:
	//   error - 创建错误信息
	Create(group *models.TaskGroup) error

	// GetByID 根据ID获取任务分组
	// 参数:
	//   id - 任务分组ID
	// 返回值:
	//   *models.TaskGroup - 任务分组模型指针
	//   error - 查询错误信息
	GetByID(id uint64) (*models.TaskGroup, error)

	// GetByUserID 根据用户ID获取任务分组列表
	// 参数:
	//   userID - 用户ID
	// 返回值:
	//   []models.TaskGroup - 任务分组模型切片
	//   error - 查询错误信息
	GetByUserID(userID uint64) ([]models.TaskGroup, error)

	// GetDefaultGroupByUserID 根据用户ID获取默认任务分组
	// 参数:
	//   userID - 用户ID
	// 返回值:
	//   *models.TaskGroup - 任务分组模型指针
	//   error - 查询错误信息
	GetDefaultGroupByUserID(userID uint64) (*models.TaskGroup, error)

	// Update 更新任务分组信息
	// 参数:
	//   group - 任务分组模型指针
	// 返回值:
	//   error - 更新错误信息
	Update(group *models.TaskGroup) error

	// Delete 删除任务分组（软删除）
	// 参数:
	//   id - 任务分组ID
	// 返回值:
	//   error - 删除错误信息
	Delete(id uint64) error
}

// TaskRepositoryInterface 定义了任务仓库的接口
// 该接口提供了任务实体的增删改查操作
type TaskRepositoryInterface interface {
	// Create 创建新任务
	// 参数:
	//   task - 任务模型指针
	// 返回值:
	//   error - 创建错误信息
	Create(task *models.Task) error

	// GetByID 根据ID获取任务
	// 参数:
	//   id - 任务ID
	// 返回值:
	//   *models.Task - 任务模型指针
	//   error - 查询错误信息
	GetByID(id uint64) (*models.Task, error)

	// GetByUserID 根据用户ID获取任务列表
	// 参数:
	//   userID - 用户ID
	// 返回值:
	//   []models.Task - 任务模型切片
	//   error - 查询错误信息
	GetByUserID(userID uint64) ([]models.Task, error)

	// GetByGroupID 根据分组ID获取任务列表
	// 参数:
	//   groupID - 分组ID
	// 返回值:
	//   []models.Task - 任务模型切片
	//   error - 查询错误信息
	GetByGroupID(groupID uint64) ([]models.Task, error)

	// GetMyDayTasks 获取用户的"我的一天"任务列表
	// 参数:
	//   userID - 用户ID
	// 返回值:
	//   []models.Task - 任务模型切片
	//   error - 查询错误信息
	GetMyDayTasks(userID uint64) ([]models.Task, error)

	// Update 更新任务信息
	// 参数:
	//   task - 任务模型指针
	// 返回值:
	//   error - 更新错误信息
	Update(task *models.Task) error

	// Delete 删除任务（软删除）
	// 参数:
	//   id - 任务ID
	// 返回值:
	//   error - 删除错误信息
	Delete(id uint64) error

	// ChangeGroup 更改任务所属分组
	// 参数:
	//   taskID - 任务ID
	//   groupID - 新分组ID
	// 返回值:
	//   error - 更新错误信息
	ChangeGroup(taskID, groupID uint64) error
}

// TaskLogRepositoryInterface 定义了任务日志仓库的接口
// 该接口提供了任务日志实体的增删改查操作
type TaskLogRepositoryInterface interface {
	// Create 创建新任务日志
	// 参数:
	//   log - 任务日志模型指针
	// 返回值:
	//   error - 创建错误信息
	Create(log *models.TaskLog) error

	// GetByID 根据ID获取任务日志
	// 参数:
	//   id - 任务日志ID
	// 返回值:
	//   *models.TaskLog - 任务日志模型指针
	//   error - 查询错误信息
	GetByID(id uint64) (*models.TaskLog, error)

	// GetByTaskID 根据任务ID获取任务日志列表
	// 参数:
	//   taskID - 任务ID
	// 返回值:
	//   []models.TaskLog - 任务日志模型切片
	//   error - 查询错误信息
	GetByTaskID(taskID uint64) ([]models.TaskLog, error)

	// Update 更新任务日志信息
	// 参数:
	//   log - 任务日志模型指针
	// 返回值:
	//   error - 更新错误信息
	Update(log *models.TaskLog) error

	// Delete 删除任务日志（软删除）
	// 参数:
	//   id - 任务日志ID
	// 返回值:
	//   error - 删除错误信息
	Delete(id uint64) error
}
